/*
ADG714可以接收SPI发送来的8bits数据对信号输出进行控制

ADG714与两片DACx0508芯片串联组成菊花链，且ADG714是最后一个芯片，因此写入ADG714的数据是最先发送的。
*/

#include <stdio.h>
#include <stdlib.h>

#include "COMMON.h"
#include "SPI.h"

#ifndef _ADG714_H_
#define _ADG714_H_

//  The following 7 macros are 'opt's
#define _AMP_CTRA_      0
#define _AMP_CTRB_      1
#define _MONITOR_EN_    2
#define _44_CTL_        3
#define _CAP_CTRA_      4
#define _CAP_CTRB_      5
#define _OS_CTR_        6

typedef struct _ADG714_Config{
    int spi_tx_size;    // 一次SPI传输的数据bit数,对于ADG714而言是8bits
    int _AMP_CTRA;       // AMP_CTRA & AMP_CTRB 共同确定一级运放的放大倍数
    int _AMP_CTRB;       // 
    int _MONITOR_EN;     // 控制是否对驱动时序进行监测
    int _44_CTL;        // 控制是否采用44所CCD
    int _CAP_CTRA;       // CAP_CTRA & CAP_CTRB 共同确定滤波电容的大小
    int _CAP_CTRB;
    int _OS_CTR;         // 控制是否将OSx-S于OSx-D连接
} ADG714_Config;

//  initialize to default settings
int init_adg714_config( ADG714_Config *adg714_cfg );

//  read ADG714 configuration data from *inifile
int read_adg714_config( ADG714_Config *adg714_cfg, char *inifile, char *section );

//  print ADG714 configurations for debug
int print_adg714_config( ADG714_Config *adg714_cfg );

// duplicate ADG714_Config
int duplicate_ADG714( ADG714_Config *cfg_old, ADG714_Config *cfg_new );

//  update configuration for a 'opt' with value 'opt_val'
int update_adg714_config( ADG714_Config *adg714_cfg, char* opt, int opt_val );

//  send configuration via SPI
int config_adg714_via_SPI(  uint32_t *gpio_reg, 
					        uint32_t *gpio2_reg, 
					        uint32_t *gpio_in_reg,
					        SPI_CONFIG *spi_config,
					        ADG714_Config *adg714_cfg );

// 将从ini参数文件读取的参数组织成24bits的spi数据
uint32_t get_adg714_reg_data( ADG714_Config *cfg );

#endif  // _ADG714_H_
